import { createSlice } from '@reduxjs/toolkit'
import { getDictByParentId } from '@/api/dict'
import { useSelector } from 'react-redux'
// 配置字典数据的slice
const dictSlice = createSlice({
    name: 'dict',
    initialState: {
        dictList: [], // 字典数据列表
        isLoading: false // 是否正在加载
    },
    reducers: {
        // 更新dict列表
        upDictList(state, action) {
            // 更新dictList
            const dictInfo = getDictInfo(state.dictList, action.payload.parentId)
            if (dictInfo) {
                // 如果存在，更新
                dictInfo.children = action.payload.dictList
            } else {
                // 如果不存在，添加
                state.dictList = action.payload.dictList
            }
        },
        // 更新isLoading
        upIsLoading(state, action) {
            state.isLoading = action.payload.isLoading
        }
    }
})

/*
 * 1.根据类别id获取子类别字典数据
 * 2.获取到子类别字典数据后，需要将数据作为子类别的children属性
 * */
const getDictInfo: any = (arr: any, id: number) => {
    // 递归遍历数组
    let result = null // 用于存储结果
    for (let i = 0; i < arr.length; i++) {
        // 如果当前元素的id等于传入的id，那么就返回当前元素
        if (arr[i].id === id) {
            result = arr[i]
            break
        } else if (arr[i].children && arr[i].children.length > 0) {
            // 如果当前元素的children属性存在，并且children属性的长度大于0，那么就递归遍历当前元素的children属性
            result = getDictInfo(arr[i].children, id)
            // 如果递归遍历不为空，那么就返回递归遍历的结果
            if (result) {
                break
            }
        }
    }
    return result
}

// 导出actions
export const { upDictList, upIsLoading } = dictSlice.actions
// 异步获取字典数据
export const getDictByParentIdAsync = (parentId: number) => {
    return async (dispatch: any) => {
        dispatch(upIsLoading({ isLoading: true })) // 更新isLoading
        const { data } = await getDictByParentId(parentId)
        dispatch(
            // 更新字典数据
            upDictList({
                dictList: data.map((item: any) => {
                    // 将字典数据转换为树形结构
                    if (item.hasChildren) {
                        item.children = []
                    }
                    return item
                }),
                parentId
            })
        )
        dispatch(upIsLoading({ isLoading: false })) // 更新isLoading
    }
}

// 导出状态
export const useDictSelector = () => useSelector((state: any) => state.dict)

export default dictSlice.reducer
